<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
     /*
     创建一个空对象，作为将要返回的对象实例
     将这个空对象的原型，指向构造函数的prototype属性
     将这个空对象赋值给函数内部的this关键字
     开始执行构造函数内部的代码
     */

     function Person(){
         this.name = 'frank'
     }
     Person.prototype.say = function(){
         console.log(this.name);
     }

     var p = new Person();
     function _new(constructor){

         var o = Object.create(constructor.prototype)
         Person.call(o);
         return o;
     }

     var p2 = _new(Person);



//    function _new(/* 构造函数 */ constructor, /* 构造函数参数 */ param1) {
//        // 将 arguments 对象转为数组
//        var args = [].slice.call(arguments);
//        // 取出构造函数
//        var constructor = args.shift();
//        // 创建一个空对象，继承构造函数的 prototype 属性
//        var context = Object.create(constructor.prototype);
//        // 执行构造函数
//        var result = constructor.apply(context, args);
//        // 如果返回结果是对象，就直接返回，则返回 context 对象
//        return (typeof result === 'object' && result != null) ? result : context;
//    }
//



</script>
</body>
</html>